home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-06 | 4.2 KB | 172 lines | [TEXT/CWIE] |
- // Program Author: Paul Baxter
- // pbaxter@assistivetech.com
- //
- //
-
- #include <Speech.h>
- #include <Ctype.h>
- #include <DeskBus.h>
- #include <Retrace.h>
-
- #include "pref.h"
- #include "globals.h"
-
- enum {
- rPrefStrings = 128
- };
- enum {
- rPrefFileName = 1
- };
-
- #define kPrefFileType 'pref'
- #define kPrefCreatorType 'PBAX'
- #define kPrefResourceType 'pref'
- #define kPrefResourceID 128
-
- #define kCurrentPrefVersion 1
-
- static short gPrefsResFile = -1;
- static OSErr OpenPrefsFile(void);
- static void ClosePrefsFile(void);
-
- // * ****************************************************************************** *
- // * LoadPrefs
- // * Load pref file into memory
- // * ****************************************************************************** *
- OSErr LoadPrefs(void)
- {
- Handle prefHandle;
- Boolean prefsExist;
- OSErr err;
-
- err = OpenPrefsFile();
- if (!err) {
- // get pref resource
- // if this is a new file it will get the resource from our default pref
- UseResFile(gPrefsResFile);
- prefHandle = GetResource(kPrefResourceType, kPrefResourceID);
- prefsExist = (HomeResFile(prefHandle) == gPrefsResFile);
- if (prefHandle && prefsExist) {
-
- // check current version
- if ((**(PrefHandle)prefHandle).version < kCurrentPrefVersion) {
-
- // delete old pref resource from pref file .. it will be updated during save
- RemoveResource(prefHandle);
- UpdateResFile(gPrefsResFile);
- DisposeHandle(prefHandle);
- prefHandle = GetResource(kPrefResourceType, kPrefResourceID);
- }
- }
- // did we at least load default prefs?
- if (!prefHandle) return -1;
-
- // lock and detach
- // This will derefenced at interupt time and can not move!!!!!!!!!
- HLockHi(prefHandle);
- DetachResource(prefHandle);
-
- // set global
- gPrefs = (PrefHandle)prefHandle;
-
- ClosePrefsFile();
-
- }
-
- return err;
- }
-
-
- // * ****************************************************************************** *
- // * OpenPrefsFile
- // * open pref file
- // * ****************************************************************************** *
- static OSErr OpenPrefsFile(void)
- {
- Str32 prefsName;
- FInfo fndrInfo;
- FSSpec spec;
- long foundDirID;
- short foundVRefNum;
- Boolean prefsExist;
- OSErr err;
-
- prefsExist = true;
- err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
- if (err) return err;
-
- GetIndString(prefsName, rPrefStrings, rPrefFileName);
-
- // see if the file exists
- err = FSMakeFSSpec( foundVRefNum, foundDirID, prefsName, &spec);
- if (err == fnfErr) {
- HCreateResFile(foundVRefNum, foundDirID, prefsName);
- prefsExist = false;
- err = ResError();
- }
- if (err) return err;
-
- // set creator and type
- err = HGetFInfo(foundVRefNum, foundDirID, prefsName, &fndrInfo);
- if ((!err) && (!prefsExist)) {
- fndrInfo.fdType = kPrefFileType;
- fndrInfo.fdCreator = kPrefCreatorType;
- err = HSetFInfo(foundVRefNum, foundDirID, prefsName, &fndrInfo);
- if (err) return err;
- }
-
- // open the file
- gPrefsResFile = HOpenResFile(foundVRefNum, foundDirID, prefsName, fsRdWrPerm);
- err = ResError();
- if (gPrefsResFile <= 0)
- err = fnfErr;
-
- return err;
- }
-
- // * ****************************************************************************** *
- // * ClosePrefsFile
- // * close pref file
- // * ****************************************************************************** *
- static void ClosePrefsFile(void)
- {
- if (gPrefsResFile > 0) {
- CloseResFile(gPrefsResFile);
- gPrefsResFile = -1;
- }
- }
-
- // * ****************************************************************************** *
- // * SavePrefs
- // * Save pref file
- // * ****************************************************************************** *
- OSErr SavePrefs(void)
- {
- Handle tmpHandle;
- OSErr err;
-
- err = OpenPrefsFile();
- if ((!err) && (gPrefs) && (gPrefsResFile > 0)) {
-
- // Remove old resource
- UseResFile(gPrefsResFile);
- SetResLoad(false);
- tmpHandle = Get1Resource(kPrefResourceType, kPrefResourceID);
- SetResLoad(true);
- if (tmpHandle) {
- RemoveResource(tmpHandle);
- UpdateResFile(gPrefsResFile);
- }
-
- // add new resource
- UseResFile(gPrefsResFile);
- AddResource((Handle)gPrefs, kPrefResourceType, kPrefResourceID, "\p");
- HUnlock((Handle)gPrefs);
- ChangedResource((Handle)gPrefs);
- WriteResource((Handle)gPrefs);
- HandToHand(&(Handle)gPrefs);
- ClosePrefsFile();
- HLock((Handle)gPrefs);
- }
- return err;
- }